package com.czk.hash;

/**
 * @Author:ChenZhangKun
 * @Date: 2021/4/6 22:16
 */
public class MyHashMap<K, V> {
    /**
     * 键值对数组
     */
    private Entry<K, V>[] table;
    /**
     * 数组的初始容量
     */
    private static final Integer CAPACITY = 8;
    /**
     * 长度
     */
    private static int size;
    /**
     * 实现put操作
     *
     * @param key
     * @param value
     */
    public void put(K key, V value) {
        if (table == null) {
            // 初始化数组
            initTable();
        }
        // hash算法
        Integer hashCode = key.hashCode();
        // 取模
        int mod = hashCode % table.length;
        // key相同，value不同的情况
        // 遍历链表
        for (Entry<K, V> entry = table[mod]; entry != null; entry = entry.next) {
            if (entry.key == key) {
                entry.value = value;
                // 结束操作
                return;
            }
        }
        // key不同，插在链表的头部
        // 直接将其放在链表头部
        Entry<K, V> entry = new Entry<>(key, value, table[mod]);
        // 放入数组
        table[mod] = entry;
        size++;
    }
    public V get(K key){
        // 遍历链表
        // 数组下标
        int mod=key.hashCode()%table.length;
        for (Entry<K,V> entry=table[mod];entry!=null;entry=entry.next){
            if (entry.key.equals(key)){
                return entry.value;
            }
        }
        return null;
    }
    private void initTable() {
        table = new Entry[CAPACITY];
    }
    public int size(){
        return size;
    }
    /**
     * 定义内部类
     * 键值对对象
     *
     * @param <K>
     * @param <V>
     */
    class Entry<K, V> {
        // 键值
        private K key;
        // 值
        private V value;
        // 下一个键值对
        private Entry<K, V> next;

        public Entry(K key, V value, Entry<K, V> next) {
            this.key = key;
            this.value = value;
            this.next = next;
        }

        public K getKey() {
            return key;
        }

        public V getValue() {
            return value;
        }
    }

    public static void main(String[] args) {
        MyHashMap map=new MyHashMap();
        map.put(1,2);
        map.put(2,3);
        System.out.println(map.get(2));
    }
}
